# _*_ coding:UTF-8 _*_
import win32api, win32con, win32gui
from ctypes import *
import ctypes.wintypes
import time
import threading
import sys

EXIT = False


def mouse_click(x=None, y=None):#这里定义一个函数鼠标移动到(x,y)位置并鼠标左键单击
    if not x is None and not y is None:
        mouse_move(x, y)#鼠标移动到(x,y)位置
        time.sleep(0.05)#休眠0.05秒
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)#鼠标左键按下
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)#鼠标左键抬起


def mouse_move(x, y):#鼠标移动到(x,y)位置
    windll.user32.SetCursorPos(x, y)#鼠标移动到(x,y)位置


class Hotkey(threading.Thread):  # 创建一个Thread.threading的扩展类，进行注册热键并停止程序的进行

    def run(self):#定义函数
        global EXIT  # 定义全局变量，这个可以在不同线程见共用。
        user32 = ctypes.windll.user32  # 加载user32.dll
        if not user32.RegisterHotKey(None, 99, win32con.MOD_ALT, win32con.VK_F3):  # 注册快捷键 alt + f3 并判断是否成功。
            raise  # 返回一个错误信息
            # 以下为判断快捷键冲突，释放快捷键
        try:
            msg = ctypes.wintypes.MSG()#获取msg信息
            # print msg
            while user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:#循环
                if msg.message == win32con.WM_HOTKEY:#如果两个信息相同
                    if msg.wParam == 99:#如果msg.wParam == 99
                        EXIT = True#将EXIT的值赋为True
                        return#返回
                user32.TranslateMessage(ctypes.byref(msg))
                user32.DispatchMessageA(ctypes.byref(msg))
        finally:
            user32.UnregisterHotKey(None, 1)
"""
这里做个解释:
这里的pywin32包的详细解释：https://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx
pywin32包能够方便的引入dll并调用其中的api函数，
查看MSDN，可以知道RegisterHotKey来自user32.dll文件，
它的参数分别是窗口句柄、快捷键标示、组合键和虚拟键。
我在消息队列中等待处理事件，如果标示符合，
就执行我们自己的代码，否则继续传给系统。
这里我把它写成了一个Thread.threading的扩展类，
这样可以作为一个线程启动，
因为Windows系统在等待按键的时候是阻塞的，
那样我们的外挂就不动啦！用一个全局变量来作为按下退出快捷键的标志.
"""

if __name__ == "__main__":
    hotkey = Hotkey()#实例化hotkey类
    hotkey.start()#hotkey类开始运行
    for event in range(1, 9999999999):#创建循环
        mouse_click(1150, 665)#鼠标移动到该位置并点击鼠标左键
        win32api.keybd_event(17, 0, 0, 0)#键盘按下ALT建
        win32api.keybd_event(86, 0, 0, 0)#键盘按下V建
        win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)#键盘抬起下V建
        win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)#键盘抬起下ALT建
        mouse_click(1272, 669)#鼠标移动到该位置并点击鼠标左键
		#这里的ALT V 键对应的数字可以在网上查到，可以搜素"键盘按键数字对照表"
        if EXIT:#如果EXIT值为真，则退出程序
            sys.exit()

